package com.jwsoft.manager.core.integration.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
import com.alicp.jetcache.Cache;
import com.alicp.jetcache.anno.CacheType;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bifang.engine.assistant.core.annotation.ApiService;
import com.bifang.engine.assistant.core.annotation.OpApi;
import com.bifang.engine.assistant.core.annotation.SaveOplog;
import com.bifang.engine.assistant.core.enums.AuTypeEnum;
import com.bifang.engine.assistant.core.enums.BoolEnum;
import com.bifang.engine.assistant.core.enums.FuncTypeEnum;
import com.bifang.engine.assistant.core.exception.AppException;
import com.bifang.engine.cache.jetcache.utils.JetCacheUtils;
import com.bifang.engine.cache.redis.RedisHelper;
import com.bifang.engine.data.core.util.PagerUtil;
import com.bifang.module.base.common.constants.BaseCache;
import com.bifang.module.base.core.helper.DictHelper;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jwsoft.manager.common.enums.CardEnum;
import com.jwsoft.manager.common.enums.DeleteTypeEnum;
import com.jwsoft.manager.common.enums.deleteSyncFlagEnum;
import com.jwsoft.manager.common.vo.common.AreaControlVO;
import com.jwsoft.manager.common.vo.eduDyjyQuerySync.DySyncResult;
import com.jwsoft.manager.common.vo.eduSyncDyApply.EduSyncDyApplyQueryVO;
import com.jwsoft.manager.common.vo.eduSyncDyApply.EduSyncDyApplyVO;
import com.jwsoft.manager.common.vo.eduSyncDyApply.EduSyncDyCommonVO;
import com.jwsoft.manager.common.vo.eduSyncDyApprove.EduSyncDyApproveQueryVO;
import com.jwsoft.manager.common.vo.eduSyncDyApprove.EduSyncDyApproveVO;
import com.jwsoft.manager.common.vo.eduSyncDyDelete.EduSyncDyDeleteKeyVO;
import com.jwsoft.manager.common.vo.eduSyncDyDelete.EduSyncDyDeleteQueryVO;
import com.jwsoft.manager.common.vo.eduSyncDyDelete.EduSyncDyDeleteVO;
import com.jwsoft.manager.common.vo.eduSyncDyEnroll.EduSyncDyEnrollQueryVO;
import com.jwsoft.manager.common.vo.eduSyncDyEnroll.EduSyncDyEnrollVO;
import com.jwsoft.manager.core.dao.model.EduSyncDyDelete;
import com.jwsoft.manager.core.dao.service.EduSyncDyApplyService;
import com.jwsoft.manager.core.dao.service.EduSyncDyApproveService;
import com.jwsoft.manager.core.dao.service.EduSyncDyDeleteService;
import com.jwsoft.manager.core.dao.service.EduSyncDyEnrollService;
import com.jwsoft.manager.core.integration.EduSyncDyApplyIntegration;
import com.jwsoft.manager.core.integration.EduSyncDyApproveIntegration;
import com.jwsoft.manager.core.integration.EduSyncDyDeleteIntegration;
import com.jwsoft.manager.core.integration.EduSyncDyEnrollIntegration;
import com.jwsoft.manager.core.util.EduHelper;
import com.jwsoft.manager.core.util.dySync.CallUtils;
import com.jwsoft.manager.core.util.dySync.JsonUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;

import java.time.Duration;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 东阳市报名专库同步情况表业务实现类
 *
 * @author wangt
 * @since 2024-06-11
 */
@ApiService(funcCode = "eduSyncDyDelete", title = "东阳市报名专库同步情况表")
public class EduSyncDyDeleteIntegrationImpl implements EduSyncDyDeleteIntegration {

    @Autowired
    public EduSyncDyDeleteService eduSyncDyDeleteService;

    @Autowired
    public EduSyncDyEnrollIntegration eduSyncDyEnrollIntegration;
    @Autowired
    public EduSyncDyEnrollService eduSyncDyEnrollService;

    @Autowired
    public EduSyncDyApplyIntegration eduSyncDyApplyIntegration;
    @Autowired
    public EduSyncDyApplyService eduSyncDyApplyService;

    @Autowired
    public EduSyncDyApproveIntegration eduSyncDyApproveIntegration;
    @Autowired
    public EduSyncDyApproveService eduSyncDyApproveService;
    @Autowired
    private EduHelper eduHelper;
    @Autowired
    private DictHelper dictHelper;

    @Autowired
    private EduDyjyQuerySyncIntegrationImpl dyjyQuerySyncIntegration;
    @Autowired
    private RedisHelper redisHelper;

    @Autowired
    private CallUtils callUtils;

    @Override
    @OpApi(funcCode = "eduSyncDyDelete0001", title = "东阳市报名专库同步情况表分页查询", funcType = FuncTypeEnum.query, checkPrivilege = BoolEnum.FALSE)
    public PageInfo<EduSyncDyDeleteVO> getList(EduSyncDyDeleteQueryVO vo) {
        // 开启分页
        if (vo.getPageNum() == null || vo.getPageSize() == null) {
            //如果不传入分页参数，默认最大取1000条
            vo.setPageNum(1);
            vo.setPageSize(1000);
        }
        QueryWrapper<EduSyncDyDelete> queryWrapper=new QueryWrapper<>();
        queryWrapper.lambda()
                .eq(org.apache.commons.lang3.StringUtils.isNotBlank(vo.getIdcard()), EduSyncDyDelete::getIdcard,vo.getIdcard())
                .orderByDesc(EduSyncDyDelete::getCreateName);
        PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
        List<EduSyncDyDelete> list = eduSyncDyDeleteService.list(queryWrapper);
        if (CollectionUtils.isEmpty(list)) {
            // 判断是否为空，为空则返回空参数
            return PagerUtil.createEmptyPagerInfo(vo.getPageNum(), vo.getPageSize());
        }
        // 不为空则获取分页结果
        PageInfo<EduSyncDyDelete> pageInfo = new PageInfo<>(list);
        // 返回参数需要通过common层的vo实体类，用该方法可以批量转换
        List<EduSyncDyDeleteVO> resultList = Convert.toList(EduSyncDyDeleteVO.class, pageInfo.getList());
        // 转义数据字典值
        dictHelper.valueToName(resultList, Arrays.asList(CardEnum.values()));
        return PagerUtil.parsePagerVo(resultList, pageInfo);
    }
    @Override
    @OpApi(funcCode = "eduSyncDyDelete0002", title = "东阳市报名专库同步情况表根据主键查询详情", funcType = FuncTypeEnum.query,checkPrivilege = BoolEnum.FALSE)
    public EduSyncDyDeleteVO getById(EduSyncDyDeleteKeyVO vo) {
        EduSyncDyDelete entity = eduSyncDyDeleteService.getById(vo.getJhDeleteId());
        if (ObjectUtils.isEmpty(entity)) {
            throw new AppException("查询不到详细信息!");
        }
        EduSyncDyDeleteVO result = Convert.convert(EduSyncDyDeleteVO.class, entity);
        return result;
    }
    /** 保存前统一校验*/
    @Override
    @OpApi(funcCode = "eduSyncDyDelete0003", title = "东阳市报名专库同步情况表保存前校验", funcType = FuncTypeEnum.other ,checkPrivilege = BoolEnum.FALSE)
    public void checkSave(EduSyncDyDeleteVO vo) {
        //主键为空为新增校验

        //主键不为空为修改校验
    }

    @Override
    @OpApi(funcCode = "eduSyncDyDelete0004", title = "东阳市报名专库同步情况表新增", funcType = FuncTypeEnum.insert)
    @SaveOplog(
            operationType = "eduSyncDyDelete0004",
            operationName = "东阳市报名专库同步情况表新增",
            dataType = "jhDeleteId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public EduSyncDyDeleteVO add(EduSyncDyDeleteVO vo) {
        //保存前校验
        checkSave(vo);
        //保存数据
        EduSyncDyDelete entity = Convert.convert(EduSyncDyDelete.class, vo);
        eduSyncDyDeleteService.save(entity);
        //将主键设置回vo使操作日志可以取到
        vo.setJhDeleteId(entity.getJhDeleteId());
        return vo;
    }

    @Override
    @OpApi(funcCode = "eduSyncDyDelete0005", title = "东阳市报名专库同步情况表修改", funcType = FuncTypeEnum.update)
    @SaveOplog(
            operationType = "eduSyncDyDelete0005",
            operationName = "东阳市报名专库同步情况表修改",
            dataType = "jhDeleteId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public EduSyncDyDeleteVO edit(EduSyncDyDeleteVO vo) {
        if (ObjectUtils.isEmpty(vo.getJhDeleteId())) {
            throw new AppException("传入需要修改的主键不能为空!");
        }
        EduSyncDyDelete oldEntity = eduSyncDyDeleteService.getById(vo.getJhDeleteId());
        if (ObjectUtils.isEmpty(oldEntity)) {
            throw new AppException("查询不到需要修改的信息!");
        }
        //保存前校验
        checkSave(vo);
        //保存数据
        EduSyncDyDelete entity = Convert.convert(EduSyncDyDelete.class, vo);
        eduSyncDyDeleteService.updateById(entity);
        return vo;
    }

    @Override
    @OpApi(funcCode = "eduSyncDyDelete0006", title = "东阳市报名专库同步情况表根据主键删除", funcType = FuncTypeEnum.delete)
    @SaveOplog(
            operationType = "eduSyncDyDelete0006",
            operationName = "东阳市报名专库同步情况表删除",
            dataType = "jhDeleteId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public void del(EduSyncDyDeleteKeyVO vo) {
        if (ObjectUtils.isEmpty(vo.getJhDeleteId())) {
            throw new AppException("传入需要删除的数据主键不能为空!");
        }
        EduSyncDyDelete entity = eduSyncDyDeleteService.getById(vo.getJhDeleteId());
        if (ObjectUtils.isEmpty(entity)) {
            throw new AppException("未找到需要删除的信息!");
        }
        eduSyncDyDeleteService.removeById(vo.getJhDeleteId());
    }

    @Override
    @OpApi(funcCode = "eduSyncDyDelete0007", title = "东阳市申请，审核，通过情况表分页查询", funcType = FuncTypeEnum.query,checkPrivilege = BoolEnum.FALSE)
    public PageInfo<EduSyncDyCommonVO> getEduSync(EduSyncDyDeleteQueryVO vo) {
        // 开启分页
        if (vo.getPageNum() == null || vo.getPageSize() == null) {
            //如果不传入分页参数，默认最大取1000条
            vo.setPageNum(1);
            vo.setPageSize(1000);
        }
        QueryWrapper<EduSyncDyDelete> queryWrapper=new QueryWrapper<>();
//        queryWrapper.lambda()
//                .eq(org.apache.commons.lang3.StringUtils.isNotBlank(vo.getIdcard()), EduSyncDyDelete::getIdcard,vo.getIdcard())
//                .orderByDesc(EduSyncDyDelete::getCreateName);
        //查询同步报名表的数据
        EduSyncDyEnrollQueryVO eduSyncDyEnroll = new EduSyncDyEnrollQueryVO();
        eduSyncDyEnroll.setIdcard(vo.getIdcard());
        List<EduSyncDyEnrollVO> listEnroll=eduSyncDyEnrollIntegration.getList(eduSyncDyEnroll).getList();
        List<EduSyncDyCommonVO> listComEnro = Convert.toList(EduSyncDyCommonVO.class,listEnroll);
        for(EduSyncDyCommonVO item:listComEnro){
            item.setDeleteType(DeleteTypeEnum.LQB.getType());
        }

        //查询同步申请表的数据
        EduSyncDyApplyQueryVO eduSyncDyApplyQueryVO = new EduSyncDyApplyQueryVO();
        eduSyncDyApplyQueryVO.setIdcard(vo.getIdcard());
        List<EduSyncDyApplyVO> listApply =  eduSyncDyApplyIntegration.getList(eduSyncDyApplyQueryVO).getList();
        List<EduSyncDyCommonVO> listComApply = Convert.toList(EduSyncDyCommonVO.class,listApply);
        for(EduSyncDyCommonVO item:listComApply){
            item.setDeleteType(DeleteTypeEnum.BMB.getType());
        }

        //查询同步审核表的数据
        EduSyncDyApproveQueryVO eduSyncDyApproveQueryVO = new EduSyncDyApproveQueryVO();
        eduSyncDyApproveQueryVO.setIdcard(vo.getIdcard());
        List<EduSyncDyApproveVO> listApprove= eduSyncDyApproveIntegration.getList(eduSyncDyApproveQueryVO).getList();
        List<EduSyncDyCommonVO> listComApprove = Convert.toList(EduSyncDyCommonVO.class,listApprove);
        for(EduSyncDyCommonVO item:listComApprove){
            item.setDeleteType(DeleteTypeEnum.SHB.getType());
        }

//开启分页
        PageHelper.startPage(vo.getPageNum(),vo.getPageSize());
        List<EduSyncDyCommonVO> listRe=  new ArrayList<>();
        listRe.addAll(listComEnro);
        listRe.addAll(listComApply);
        listRe.addAll(listComApprove);

        if (CollectionUtils.isEmpty(listRe)) {
            // 判断是否为空，为空则返回空参数
            return PagerUtil.createEmptyPagerInfo(vo.getPageNum(), vo.getPageSize());
        }

        PageInfo<EduSyncDyCommonVO> pageInfo = new PageInfo<>(listRe);
        dictHelper.valueToName(listRe, Arrays.asList(CardEnum.values()));
        return PagerUtil.parsePagerVo(listRe, pageInfo);
}


    @Override
    @OpApi(funcCode = "eduSyncDyDelete0008", title = "东阳市报名专库申请，审核，录取同步情况表删除", funcType = FuncTypeEnum.delete)
    @SaveOplog(
            operationType = "eduSyncDyDelete0008",
            operationName = "东阳市报名专库申请，审核，录取同步情况表删除",
            dataType = "jhDeleteId",
            auType = AuTypeEnum.OTHER)
    @Transactional
    public void delSyncAll(EduSyncDyDeleteKeyVO vo) {
        if(ObjectUtils.isEmpty(vo.getIdcard())){
            throw new AppException("证件号码不能为空，请输入证件号码");
        }
        EduSyncDyDeleteQueryVO eduSyncDyDeleteQueryVO = new EduSyncDyDeleteQueryVO();
        eduSyncDyDeleteQueryVO.setIdcard(vo.getIdcard());
//查看是否获取到了每个deletetype的数据（调用0007接口）
        List<EduSyncDyCommonVO> lisComm = this.getEduSync(eduSyncDyDeleteQueryVO).getList();

        List<EduSyncDyCommonVO> listApply = lisComm.stream()
                .filter(clear -> DeleteTypeEnum.BMB.getType().equals(clear.getDeleteType()))
                .collect(Collectors.toList());
        if(CollectionUtils.isEmpty(listApply)){
            listApply = new ArrayList<EduSyncDyCommonVO>();
        }

        List<EduSyncDyCommonVO> listApprove = lisComm.stream()
                .filter(clear -> DeleteTypeEnum.SHB.getType().equals(clear.getDeleteType()))
                .collect(Collectors.toList());
        if(CollectionUtils.isEmpty(listApprove)){
            listApprove = new ArrayList<EduSyncDyCommonVO>();
        }

        List<EduSyncDyCommonVO> listLuQu = lisComm.stream()
                .filter(clear -> DeleteTypeEnum.LQB.getType().equals(clear.getDeleteType()))
                .collect(Collectors.toList());
        if(CollectionUtils.isEmpty(listLuQu)){
            listLuQu = new ArrayList<EduSyncDyCommonVO>();
        }

        //如果有数据则分别删除三张中的数据，按照一定的顺序
        if(listLuQu.size()>0){
            eduSyncDyEnrollService.removeById(listLuQu.get(0).getJhEnrollId());
        }

        if(listApprove.size()>0){
            eduSyncDyApproveService.removeById(listApprove.get(0).getJhApproveId());
        }

        if(listApply.size()>0){
            eduSyncDyApplyService.removeById(listApply.get(0).getJhApplyId());
        }


        //若三张表都有该学生的数据则对edu_sync_dy_delete表进行插入
        if(listApply.size()>0&&listApprove.size()>0&&listLuQu.size()>0){
            EduSyncDyApplyQueryVO eduSyncDyApplyQueryVO = new EduSyncDyApplyQueryVO();
            eduSyncDyApplyQueryVO.setYear(eduHelper.thisYear());
            eduSyncDyApplyQueryVO.setEnrollStatus("2");//2是已录取
            eduSyncDyApplyQueryVO.setIdcard(vo.getIdcard());
//            eduSyncDyApplyQueryVO.set
            EduSyncDyCommonVO eduSyncDyCommonVO = eduSyncDyApplyIntegration.getListByIdCard(eduSyncDyApplyQueryVO);
            if (ObjectUtils.isEmpty(eduSyncDyCommonVO)) {
                throw new AppException("正式报名表中不存在该数据，请检查数据是否正确");
            } else {
                EduSyncDyDelete eduSyncDyDelete = Convert.convert(EduSyncDyDelete.class, eduSyncDyCommonVO);
                eduSyncDyDelete.setDeleteId(listApply.get(0).getJhApplyId());
                eduSyncDyDelete.setDeleteSyncFlag(deleteSyncFlagEnum.TBCG.getType());
                eduSyncDyDeleteService.save(eduSyncDyDelete);
            }

        } else {
            throw new AppException("查询不到需要删除的转库信息");
        }
    }

    @Override
    public int eduJhjyDelSync(AreaControlVO vo) {
        String redisKey="dyedu:syncDyDelete:batchSync";
        if(redisHelper.hasKey(redisKey)){
            throw new AppException("正在批量同步金华删除数据处理中......");
        }
        redisHelper.set(redisKey,"1",1800);
        Integer year=eduHelper.thisYear();
        if (StringUtils.isBlank(vo.getAreaCode())){
            vo.setAreaCode(eduHelper.thisAreaCode());
        }
        QueryWrapper<EduSyncDyDelete> queryWrapper = new QueryWrapper<>();
        queryWrapper.lambda().eq(EduSyncDyDelete::getYear, year)
                .eq(EduSyncDyDelete::getApplyCountyCode,vo.getAreaCode())
                .eq(EduSyncDyDelete::getDeleteSyncFlag,BoolEnum.FALSE.getType())
                .orderByDesc(EduSyncDyDelete::getDeleteType);
        List<EduSyncDyDelete> list=eduSyncDyDeleteService.list(queryWrapper);

        if (CollectionUtils.isEmpty(list)){
            QueryWrapper<EduSyncDyDelete> queryWrapperError = new QueryWrapper<>();
            queryWrapper.lambda().eq(EduSyncDyDelete::getYear, year)
                    .eq(EduSyncDyDelete::getApplyCountyCode,vo.getAreaCode())
                    .eq(EduSyncDyDelete::getDeleteSyncFlag,"2")
                    .orderByDesc(EduSyncDyDelete::getDeleteType);
            List<EduSyncDyDelete> errorList=eduSyncDyDeleteService.list(queryWrapperError);
            if(CollectionUtils.isEmpty(errorList)){
                redisHelper.del(redisKey);
                return 0;
            }
            list=errorList;
        }
        int i=0;
        for(EduSyncDyDelete delete:list){
            try {
                deleteSyncStudentInfo(delete);
                delete.setDeleteSyncFlag("1");
                delete.setDeleteSyncRemark("成功");
                eduSyncDyDeleteService.updateById(delete);
                i++;
            }catch (AppException e){
                delete.setDeleteSyncFlag("2");
                String msg=e.getMsg();
                if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(msg)&&msg.length()>300){
                    msg=msg.substring(0,300);
                }
                delete.setDeleteSyncRemark(msg);
                eduSyncDyDeleteService.updateById(delete);
            }catch (Exception e){
                delete.setDeleteSyncFlag("2");
                String msg=e.getMessage();
                if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(msg)&&msg.length()>300){
                    msg=msg.substring(0,300);
                }
                delete.setDeleteSyncRemark(msg);
                eduSyncDyDeleteService.updateById(delete);
            }

        }
        redisHelper.del(redisKey);
        return i;
    }

    private void deleteSyncStudentInfo(EduSyncDyDelete vo) {
        String accessToken = "";
        Cache<String, String> tokenCache = JetCacheUtils.create(BaseCache.CACHE_ACCESS_TOKEN_CLIENT, CacheType.BOTH, Duration.ofSeconds(1500L), Duration.ofSeconds(60));
        String redisKey = vo.getApplyCountyCode() + vo.getYear();
        accessToken = tokenCache.get(redisKey);
        if (StringUtils.isBlank(accessToken)) {
            //调用获取token方法，得到token信息
            DySyncResult token = dyjyQuerySyncIntegration.getToken();
            accessToken = (String) token.getData().get("accessToken");
            tokenCache.put(redisKey, accessToken);
        }
        if (StringUtils.isBlank(accessToken)) {
            throw new AppException("accessToken不能为空");
        }

        Map<String, Object> params = BeanUtil.beanToMap(vo, false, true);

        //map转string
        String paramsStr = JsonUtil.toJsonString(params);
        //将传入参数 进行签名
        String timestamp = String.valueOf(System.currentTimeMillis());
        //参数进行加密
        String appKey = dyjyQuerySyncIntegration.getCommon("dy_sync_appKey");

        String encrypt = callUtils.encrypt(paramsStr, appKey);
        //根据参数，密钥，时间生成签名
        String appSecret = dyjyQuerySyncIntegration.getCommon("dy_sync_appSecret");


        //加密传参
        HashMap<String, String> map = new HashMap<>();
        map.put("cryptoStr", encrypt);
        String cryptoStr = JSONObject.toJSONString(map);

        String signature = callUtils.getSign(cryptoStr, appSecret, timestamp);
        if (StringUtils.isBlank(signature)) {
            throw new AppException("签名不能为空");
        }
        //调用同步删除接口
        String reqUrl = dyjyQuerySyncIntegration.getCommon("dy_sync_reqUrl");
        String appId = dyjyQuerySyncIntegration.getCommon("dy_sync_appId");
        String url = reqUrl + "syncJhDelete0001";
        String data = encrypt;
        HttpResponse execute = HttpRequest.post(url)
                //设置请求体
                .header("Content-Type", "application/json")
                .header("signature", signature)
                .header("timestamp", timestamp)
                .header("accessToken", accessToken)
                .header("appId", appId)
                .setReadTimeout(10000)
                .body(cryptoStr) //加密
                .execute();
        String body = execute.body();
        if (StringUtils.isBlank(body)) {
            throw new AppException("请求接口失败失败，未返回信息");
        }
        JSONObject jsonBody = JSONObject.parseObject(body);
        JSONObject jsonObject = null;
        try {
            jsonObject = JSONObject.parseObject(body);
            if (jsonObject.getInteger("code") != 0) {
                if ("401".equals(jsonObject.getString("code")) || "456".equals(jsonObject.getString("code"))) {
                    //调用获取token方法，得到token信息
                    DySyncResult token = dyjyQuerySyncIntegration.getToken();
                    accessToken = (String) token.getData().get("accessToken");
                    tokenCache.put(redisKey, accessToken);
                } else {
                    String errorMessage = (String) jsonObject.get("message");
                    throw new AppException("错误原因：" + errorMessage);
                }
            }
        } catch (AppException e) {
            throw new AppException(e.getMsg());
        } catch (Exception e) {
            throw new AppException("请求接口失败失败：" + body);
        }
        //密文
        String encryptResult = (String) jsonObject.get("result");
        if (StringUtils.isNotBlank(encryptResult)) {
            //对密文进行解密
            String decryptResult = callUtils.decrypt(encryptResult, appSecret);
            //解密后的密文转json
            JSONObject jsoncontent = JSONObject.parseObject(decryptResult);
            //转换json
            jsonBody.put("result", jsoncontent);
        }
    }

}
